package fr.esiag.projet17.persistence.dao.oracle.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import fr.esiag.projet17.persistence.dao.IDAO;
import fr.esiag.projet17.persistence.dao.oracle.DAO;
import fr.esiag.projet17.persistence.dao.oracle.DAOFactory;
import fr.esiag.projet17.persistence.entity.Utilisateur;

/**
 * @author teddy
 * 
 */
public class UtilisateurDAO extends DAO<Utilisateur> implements IDAO<Utilisateur> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	

	/**
	 * @param conn
	 */
	public UtilisateurDAO(){
		super();
	}
	
	@Override
	public Long create(Utilisateur newInstance){
		Long id = null;
		try {
			Statement seqStatement = DAO.connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            ResultSet result = seqStatement.executeQuery(
                                    		DAOFactory.getProps().getProperty("sql.utilisateur.seq")
                                    );
			if(result.first()){
				id = result.getLong("id_user");
                PreparedStatement prepare = DAO.connection
                                                .prepareStatement(
                                                		DAOFactory.getProps().getProperty("sql.utilisateur.create")
                                                );
				prepare.setLong(1, id);
				prepare.setString(2, newInstance.getLogin());
				prepare.setString(3, newInstance.getPassword());
				prepare.setString(4, newInstance.getName());
				prepare.setString(5, newInstance.getSurname());
				prepare.setString(6, newInstance.getRole());
				prepare.executeUpdate();

				connection.commit();
				
			}
	    } catch (SQLException e) {
	            e.printStackTrace();
	    }
	    return id;
	}

	@Override
	public Utilisateur read(Long id) {
		Utilisateur util = null;
		try {
            ResultSet result = DAO.connection
                                    .createStatement(
                                    	ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                        ResultSet.CONCUR_READ_ONLY
                                     ).executeQuery(DAOFactory.getProps().getProperty("sql.utilisateur.read") + id
                                     );
            if(result.first())
                    util = new Utilisateur(
                                        	id, 
                                        	result.getString("login"), 
                                        	result.getString("password"),
                                        	result.getString("name"),
                                        	result.getString("surname"),
                                        	result.getString("role")
                                        );
            
		    } catch (SQLException e) {
		            e.printStackTrace();
		    }
		    return util;
	}
	
	public Utilisateur read(String login, String password) {
		Utilisateur util = null;
		try {
			 PreparedStatement prepare = DAO.connection.prepareStatement(
             		DAOFactory.getProps().getProperty("sql.utilisateur.readByCredentials"),ResultSet.TYPE_SCROLL_INSENSITIVE, 
                    ResultSet.CONCUR_READ_ONLY
             );
			 prepare.setString(1, login);
			 prepare.setString(2, password);
            ResultSet result = prepare.executeQuery();
            if(result.first())
                    util = new Utilisateur(
                                        	result.getLong("id_user"), 
                                        	result.getString("login"), 
                                        	result.getString("password"),
                                        	result.getString("name"),
                                        	result.getString("surname"),
                                        	result.getString("role")
                                        );
            
		    } catch (SQLException e) {
		            e.printStackTrace();
		    }
		    return util;
	}

	

	@Override
	public void update(Utilisateur transientObject) {
		// TODO : update utilisateur
		
	}

	@Override
	public void delete(Utilisateur persistentObject) {
		// TODO : delete utilisateur
		
	}
}